﻿using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Windows.Controls;
using System.Drawing.Imaging;
using System.Drawing;
using System.Windows;

namespace ExEdit.Engine
{
    /// <summary>
    /// klasa do zarządania danymi exif/zapis/odczyt
    /// </summary>
    public class ExEditProcessing
    {
        /// <summary>
        /// Odczyt danych exif dla wybranego pliku
        /// </summary>
        /// <param name="filepath">Sciezka do wybranego pliku</param>
        /// <returns>Lista elementow exif(nazwa-wartość)</returns>
        public List<ExifMetadataItem> ReadMetadateFromImage(string filepath)
        {
            List<ExifMetadataItem> listOfProperty = new List<ExifMetadataItem>();
            System.Drawing.Image theImage = Bitmap.FromFile(filepath);

            PropertyItem[] propItems = theImage.PropertyItems;

            Encoding enc = Encoding.UTF8;
            //odczyt metadanych exif
            foreach (PropertyItem propItem in propItems)
            {
                switch (propItem.Id.ToString("x"))
                {
                    case "10f":
                        listOfProperty.Add(new ExifMetadataItem() { ExifPropertyName = "Producent", ExifPropertyValue = enc.GetString(propItem.Value).ToString(), ProperyId = propItem.Id });
                        break;
                    case "110":
                        listOfProperty.Add(new ExifMetadataItem() { ExifPropertyName = "Model", ExifPropertyValue = enc.GetString(propItem.Value).ToString(), ProperyId = propItem.Id });
                        break;
                    case "9003":
                        break;
                    //case "9004":
                    //    listOfProperty.Add(new ExifMetadataItem() { ExifPropertyName = "Data", ExifPropertyValue = enc.GetString(propItem.Value).ToString(), ProperyId = propItem.Id });
                    //    break;
                    default:
                        break;
                }



            }
            return listOfProperty;
        }

        /// <summary>
        /// zapisywanie danych
        /// </summary>
        /// <param name="exifList"></param>
        /// <param name="filepath"></param>
        /// <returns></returns>
        public string SaveMetadataForImage(List<ExifMetadataItem> exifList, string filepath)
        {
            try
            {
                Encoding encoder = Encoding.UTF8;
                System.Drawing.Image zapisywanyobrazek = Bitmap.FromFile(filepath);
                //kody właściwosci exif
                PropertyItem propItem271 = zapisywanyobrazek.GetPropertyItem(271);
                PropertyItem propItem272 = zapisywanyobrazek.GetPropertyItem(272);
                //   PropertyItem propItem36867 = zapisywanyobrazek.GetPropertyItem(36867);
                //   if(zapisywanyobrazek.PropertyIdList.Where(f=>f==36868).Count>0)
                //      PropertyItem propItem36868 = zapisywanyobrazek.GetPropertyItem(36868);

                //    propItem36867.Value = encoder.GetBytes(exifList.Where(f => f.ProperyId == 36867).Select(t => t.ExifPropertyValue).FirstOrDefault() + '\0');
                //   propItem36868.Value = encoder.GetBytes(exifList.Where(f => f.ProperyId == 36868).Select(t => t.ExifPropertyValue).FirstOrDefault());
                propItem271.Value = encoder.GetBytes(exifList.Where(f => f.ProperyId == 271).Select(t => t.ExifPropertyValue).FirstOrDefault());
                propItem272.Value = encoder.GetBytes(exifList.Where(f => f.ProperyId == 272).Select(t => t.ExifPropertyValue).FirstOrDefault());
                //  zapisywanyobrazek.SetPropertyItem(propItem36867);
               // zapisywanyobrazek.SetPropertyItem(propItem36868);
                zapisywanyobrazek.SetPropertyItem(propItem271);
                zapisywanyobrazek.SetPropertyItem(propItem272);
                string sciezkazapisu = filepath.Remove(filepath.LastIndexOf('\\')) + @"\" + Guid.NewGuid().ToString() + ".jpg";
                zapisywanyobrazek.Save(sciezkazapisu);//zapisz w danej sciezkce + dodaj guida - zeby nazwa była unikalna

                return sciezkazapisu;
            }
            catch (Exception ex)
            {
                //niepowodzenie - zwroc pustą sciężkę
                MessageBox.Show(ex.Message);
                return string.Empty;
            }
        }
    }
}
//